package com.gitee.slowcreator.http.annotation;

import com.gitee.slowcreator.http.exception.HttpRetryException;

import java.lang.annotation.*;

/**
 * 重试注解 简单的重试 就不使用spring-retry了 而且非spring环境下使用还有点麻烦
 *
 * @author zxw
 * @date 2023/1/8 上午8:40
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Retry {

    /**
     * 是否开启重试 默认不开启重试
     * 不分成两个注解 都放在 HttpClient 上 用一个标志开启
     *
     * @return
     */
    boolean open() default false;

    /**
     * 重试次数 默认重试一次
     *
     * @return
     */
    int retryTimes() default 1;

    /**
     * 什么异常不重试
     * 异常以及异常的子类都不会重试
     * noRetryFor 优先级高于 retryFor
     * 如果设置了 {@link java.lang.RuntimeException}
     * 则 {@link com.gitee.slowcreator.http.exception.SlowCreatorException} 以及下面的所有子类都不会重试
     * 即使retryFor写了 {@link com.gitee.slowcreator.http.exception.SlowCreatorException} 需要重试
     *
     * @return
     */
    Class<? extends Throwable>[] noRetryFor() default {};

    /**
     * 什么异常重试
     * 异常以及异常的子类都会重试
     * 如果写了 {@link com.gitee.slowcreator.http.exception.SlowCreatorException}
     * 则 {@link com.gitee.slowcreator.http.exception.HttpRetryException} 会重试
     *
     * @return
     */
    Class<? extends Throwable>[] retryFor() default HttpRetryException.class;

    /**
     * 是否遍历异常 默认取最后一个
     *
     * @return
     */
    boolean traverseCauses() default false;

    /**
     * todo 延迟相关暂未实现
     * 延迟时间 默认100毫秒
     *
     * @return
     */
    long delay() default 100;

    /**
     * todo 延迟相关暂未实现
     * 乘数  delay = delay * multiplier
     *
     * @return
     */
    double multiplier() default 1;

    /**
     * todo 延迟相关暂未实现
     * 最大休眠时间，默认30秒
     *
     * @return
     */
    long maxWait() default 30000;
}
